home *** CD-ROM | disk | FTP | other *** search
-
- IDT 'SUBR'
- *
- * SUBROUTINES USED AS UTILITIES IN VARIOUS MACRO LANGUAGE EXTENSIONS AND
- * SIGNAL PROCESSING LANGUAGE MACROS.
- *
- REF ONE,MINUS
- REF XR0,XR1
- *
- * LDAC$ - LOAD THE ACCUMULATOR WITH VALUE FOUND IN PROGRAM MEMORY,
- * AT LOCATION POINTED TO BY ADDRESS ON THE TOP OF THE STACK.
- *
- DEF LDAC$
- LDAC$ POP
- TBLR XR0
- ADD ONE
- PUSH
- LAC XR0
- RET
- *
- *
- * RIP$ - SUBROUTINE USED FOR LOOPED VERSION OF RIPPLE MACRO
- *
- DEF RIP$
- RIP$ POP
- TBLR XR0 * 1st argument = length
- LAR AR0,XR0 * R0 = count
- LARP AR0
- MAR *- * Decrement count
- SAR AR0,XR0 * Store L-1 in XR0
- ADD ONE * Increment argument pointer
- TBLR XR1 * 2nd argument = address
- LAR AR1,XR1 * Save address in R1
- SACL XR1 * Save argument pointer
- LAC XR0 * ACC = L-1
- SAR AR1,XR0 * Get address from R1
- ADD XR0 * ACC = address + L-1
- SACL XR0 * Save address
- LAR AR1,XR0 * R1 = address pointer
- RIP$L LARP AR1
- DMOV *-,AR0 * Shift data
- BANZ RIP$L
- LAC XR1 * Restore argument pointer
- ADD ONE * Decrement argument pointer
- PUSH * Put return address on top of stack
- RET
- *
- * LDAX$ - Load Accumulator with Double Word.
- *
- DEF LDAX$
- LDAX$ POP * Get address of constants
- TBLR XR1 * Read upper half
- ADD ONE
- TBLR XR0 * Read lower half
- ADD ONE
- PUSH
- ZALH XR1 * Load upper half
- ADDS XR0 * Load lower half
- RET
- *
- * LDAR$0 - Load Auxiliary Register 0 with word from program memory
- *
- DEF LDAR$0
- LDAR$0 POP * Get Address of Word
- TBLR XR0 * Read word into data memory
- LAR AR0,XR0 * Load into AR0
- ADD ONE
- PUSH * Restore return address
- RET
- *
- * LDAR$1 - Load Auxiliary Register 1 with word from program memory
- *
- DEF LDAR$1
- LDAR$1 POP * Get Address of Word
- TBLR XR0 * Read word into data memory
- LAR AR1,XR0 * Load into AR1
- ADD ONE
- PUSH * Restore return address
- RET
- *
- * LTK$ - Load T Register with word from program memory
- *
- DEF LTK$
- LTK$ POP * Get address of word
- TBLR XR0 * Read word into data memory
- LT XR0 * Load word into T register
- ADD ONE
- PUSH * Restore return address
- RET
- *
- * Instructions for MOVE macro. There are four different entry positions,
- * but all of them use code starting at MOV$M to do actual data transfer.
- *
- *
- * MOVAB$ - MOVE A,B
- *
- MOVAB$ POP
- TBLR XR0 * Read A into AR0
- LAR AR0,XR0
- ADD ONE
- MOVB$$ TBLR XR0 * Read B into AR1
- LAR AR1,XR0
- ADD ONE
- B MOV$M * Move Data
- *
- * MOVA$ - MOVE A,*
- *
- MOVA$ POP
- TBLR XR0 * Move A into AR0
- LAR AR0,XR0
- ADD ONE
- B MOV$M
- *
- * MOVB$ - MOVE *,B
- *
- MOVB$ POP
- B MOVB$$ * Move B into AR1
- *
- * MOV$$ - MOVE *,*
- *
- MOV$$ POP
- MOV$M TBLR XR0 * Read number of elements to move
- SACL XR1 * Save Return Address
- LARP 0
- MOV$L LAC *+,0,AR1 * Move @AR0 to ACC
- SACL *+,0,AR0 * Move ACC to @AR1
- LAC XR0
- SUB ONE * Decrement Loop Counter
- SACL XR0
- BNZ MOV$L * Loop back for another move
- LAC XR1
- ADD ONE
- PUSH * Restore return address
- RET
- DEF MOVAB$,MOVA$,MOVB$,MOV$$
- *
- * SETS$ - Move Constant into L postions of Data Memory
- *
- SETS$ POP
- TBLR XR0 * Get 1st argument - constant
- ADD ONE
- TBLR XR1 * Get 2nd argument - count
- LAR AR0,XR1 * Use AR0 as counter
- LARP 0
- MAR *-
- ADD ONE
- TBLR XR1 * Get 3rd argument - destination
- LAR AR1,XR1 * Use AR1 as pointer
- SACL XR1 * Save Return Address
- LAC XR0 * Load Constant into Accumulator
- SET$L LARP 1
- SACL *+,0,AR0 * Move Constant to data memory
- BANZ SET$L * Repeat L times
- LAC XR1
- ADD ONE
- PUSH * Restore Return Address
- RET
- DEF SETS$
- *
- * MOVC$ AND MOVC$1 - Move List of Constants to Data Memory
- *
- MOVC$ POP * Get Argument Pointer
- TBLR XR0 * 1st Argument = Destination
- LAR AR1,XR0 * Use AR1 as pointer
- ADD ONE * Increment Arg pointer
- B MOVC$M
- MOVC$1 POP
- MOVC$M TBLR XR0 * Read length of data
- LAR AR0,XR0 * AR0 is loop counter
- LARP 0
- MAR *- * Decrement counter
- ADD ONE * Increment arg pointer
- MOVC$L LARP 1
- TBLR *+,AR0 * Read constant
- ADD ONE
- BANZ MOVC$L * Loop for length of data
- PUSH * Restore return address
- RET
- DEF MOVC$,MOVC$1
- *
- * Routines for MOVDAT macro
- *
- * MOVA$B - MOVDAT A,B,L
- *
- MOVA$B POP
- TBLR XR0 * 1st Argument is source
- LAR AR0,XR0
- ADD ONE * Increment pointer
- MOVCB$ TBLR XR0 * Next Argument is destination
- LAR AR1,XR0
- ADD ONE * Increment pointer
- B MOV$$M
- *
- * MOVC$A - MOVDAT A,*,L or MOVDAT A,,L
- *
- MOVC$A POP
- TBLR XR0 * Read Source Argument
- LAR AR0,XR0
- ADD ONE * Increment Pointer
- B MOV$$M
- *
- * MOVC$B - MOVDAT *,B,L or MOVDAT ,B,L
- *
- MOVC$B POP
- B MOVCB$ * Get Destination Argument
- *
- * MOVC$$ - MOVDAT ,*,L or MOVDAT *,,L or MOVDAT *,*,L
- *
- MOVC$$ POP
- MOV$$M SAR AR0,XR0 * Save Source Location
- TBLR XR1 * Read Length
- LAR AR0,XR1
- LARP 0
- MAR *- * Decrement Count
- SACL XR1 * Save Return Address
- LAC XR0 * Load Start Address
- MOV$$L LARP 1
- TBLR *+,AR0 * Move to Data Memory
- ADD ONE * Update Source Pointer
- BANZ MOV$$L * Loop on Array Length
- LAC XR1
- ADD ONE
- PUSH * Restore Return Address
- RET
- DEF MOVA$B,MOVC$A,MOVC$B,MOVC$$
- *
- * MOVROM routines
- *
- * TBW$$ - MOVROM A,B,L
- *
- TBW$$ POP
- TBLR XR0 * Read Source Address
- LAR AR0,XR0
- ADD ONE * Update Pointer
- TBW0$ TBLR XR0 * Read Destination Address
- LAR AR1,XR0
- ADD ONE * Update Pointer
- B TBW$M
- *
- * TBW$1 - MOVROM A,*,L or MOVROM A,,L
- *
- TBW$1 POP
- TBLR XR0 * Read Source Address
- LAR AR0,XR0
- ADD ONE * Update Pointer
- B TBW$M
- *
- * TBW$0 - MOVROM *,B,L or MOVROM ,B,L
- *
- TBW$0 POP
- B TBW0$ * Read Destination Address
- *
- * TBW$$ - MOVROM *,*,L or MOVROM *,,L or MOVROM ,*,L
- *
- TBW$01 POP
- TBW$M SAR AR1,XR0 * Save Destination Address
- TBLR XR1 * Read Length of Move
- LAR AR1,XR1
- LARP 1
- MAR *- * Decrement Counter
- SACL XR1 * Save Return Address
- LAC XR0 * Load Destination Address
- TBW$L LARP 0
- TBLW *+,AR1 * Move Data
- ADD ONE * Increment Pointer
- BANZ TBW$L * Loop on Length
- LAC XR1
- ADD ONE
- PUSH * Restore Return Address
- RET
- DEF TBW$$,TBW$1,TBW$0,TBW$01
- END